unit Mededeling_Unit;

interface

uses Classes, DateUtils, SysUtils, StrUtils,
     TVGidsNLProgramma_Unit;

type
  TMededelingStatus = (MEDEDELING_NOG_NIET, MEDEDELING_MELDEN, MEDEDELING_OP_DIT_MOMENT, MEDEDELING_VERLEDEN, MEDEDELING_ONBEKEND);

  TMededelingOnClick = procedure() of object;
  TMededeling = class(TObject)
  private
    { Private declarations }
    status: TMededelingStatus;
    tekst: TStrings;
    counter: Integer;
    begintijd: TDateTime;
    eindtijd: TDateTime;
    mededelingOnClickAdres: String;
    mededelingOnClick: TMededelingOnClick;
    uitstelTijd: TDateTime;
  public
    { Public declarations }
    property var_status: TMededelingStatus read status write status;
    property var_tekst: TStrings read tekst write tekst;
    property var_counter: Integer read counter write counter;
    property var_begintijd: TDateTime read begintijd write begintijd;
    property var_eindtijd: TDateTime read eindtijd write eindtijd;
    property var_mededelingOnClickAdres: String read mededelingOnClickAdres write mededelingOnClickAdres;
    property var_mededelingOnClick: TMededelingOnClick read mededelingOnClick write mededelingOnClick;

    function checkVisible() : Boolean;
    function getMededelingStatus() : TMededelingStatus;
    function parsTVGidsNLProgrammaData(TVGidsNLProgramma: TTVGidsNLProgramma;mededelingOnClick: TMededelingOnClick) : Boolean;
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;    
  end;

implementation

  {
    * checkVisible
  }
  function TMededeling.checkVisible() : Boolean;
  begin
    result := False;

    //controleren of de mededeling nog zichtbaar moet blijven
    if counter > 0 then
    begin

      //mededeling moet nog even zichtbaar blijven
      counter := counter - 1;
      result := True;
    end;
  end;

  {
    * getTijdTotBeginTijd
  }
  function TMededeling.getMededelingStatus() : TMededelingStatus;
  begin

    //controleren of begintijd nog moet komen en het aantal minuten langer dan 20
    if ((Now() < beginTijd) and (MinutesBetween(Now(), begintijd) > 20)) or (Now() < uitstelTijd) then
    begin
      //programma komt pas later
      result := MEDEDELING_NOG_NIET;
    end
    else
    begin
      //programma komt binnen 20 minuten of is al geweest

      //controleren of begintijd als is verstreken
      if (Now() > begintijd) then
      begin
        //programma is al aan de gang of is al geweest

        //controleren of eindtijd al is verstreken
        if (Now() > eindtijd) then
        begin
          //programma is al geweest
          result := MEDEDELING_VERLEDEN;
        end
        else
        begin
          //programma is aan de gang
          result := MEDEDELING_OP_DIT_MOMENT;
        end;
      end
      else
      begin
        //programma is nog niet aan de gang

        //programma moet al wel worden gemeld

        //melding tonen, deze is in melden status met een suspendTijd langer dan 5 minuten
        result := MEDEDELING_MELDEN;
      end;
    end;
  end;

  {
    * parsTVGidsNLProgrammaDataNaarMededeling
  }
  function TMededeling.parsTVGidsNLProgrammaData(TVGidsNLProgramma: TTVGidsNLProgramma;mededelingOnClick: TMededelingOnClick) : Boolean;
  begin

    //tijden omrekenen naar DateTime
    begintijd := EncodeDateTime(YearOf(Now()),
                                MonthOf(Now()),
                                DayOf(Now()),
                                StrToIntDef(LeftStr(TVGidsNLProgramma.var_begintijd, 2), 0),
                                StrToIntDef(RightStr(TVGidsNLProgramma.var_begintijd, 2), 0),
                                0,
                                0);

    eindtijd  := EncodeDateTime(YearOf(Now()),
                                MonthOf(Now()),
                                DayOf(Now()),
                                StrToIntDef(LeftStr(TVGidsNLProgramma.var_eindtijd, 2), 0),
                                StrToIntDef(RightStr(TVGidsNLProgramma.var_eindtijd, 2), 0),
                                0,
                                0);

    //controle's op datums

    //controleren of een beginTijd dag correctie noodzakelijk is
    if TVGidsNLProgramma.var_beginTijdDagCorrectie then
      IncDay(begintijd, 1);

    //controleren of een eindTijd dag correctie noodzakelijk is
    if TVGidsNLProgramma.var_eindTijdDagCorrectie then
      IncDay(eindtijd, 1);

    //uitstelTijd uitlezen
    uitstelTijd := TVGidsNLProgramma.var_uitstelTijd;

    //Mededeling Tekst opschonen
    Self.tekst.Clear();

    //Mededeling tekst aanvullen
    Self.tekst.Add('TVGids.nl Programma Mededeling!');
    Self.tekst.Add('');

    //status berekenen
    status := getMededelingStatus();

    //controleer als het programma er zo op komt
    if status = MEDEDELING_MELDEN then
    begin
      Self.tekst.Add(TVGidsNLProgramma.var_naam);
      Self.tekst.Add(' begint over ' + IntToStr( MinutesBetween(Now(), begintijd) ) + ' minuten op ' + TVGidsNLProgramma.var_zender);
    end
    else
    //controleren of het programma op dit moment bezig is
    if status = MEDEDELING_OP_DIT_MOMENT then
    begin
      Self.tekst.Add(TVGidsNLProgramma.var_naam);
      Self.tekst.Add(' is al begonnen op ' + TVGidsNLProgramma.var_zender + ' en duurt nog ' + IntToStr(MinutesBetween(Now(), eindtijd)) + ' minuten');
    end;

    Self.tekst.Add('');
    Self.tekst.Add('');
    Self.tekst.Add('Naam  : ' + TVGidsNLProgramma.var_naam);
    Self.tekst.Add('Genre : ' + TVGidsNLProgramma.var_genre);
    Self.tekst.Add('Tijd  : ' + TVGidsNLProgramma.var_begintijd + ' tot ' + TVGidsNLProgramma.var_eindtijd);
    Self.tekst.Add('Duur  : ' + IntToStr(MinutesBetween(begintijd, eindtijd)) + ' minuten');
    Self.tekst.Add('Zender: ' + TVGidsNLProgramma.var_zender);

    //programma onclick adres instellen
    mededelingOnClickAdres := 'http://www.tvgids.nl/programmadetail/?ID=' + TVGidsNLProgramma.var_id;

    //meegegeven mededelingOnClick koppelen aan deze mededeling
    Self.mededelingOnClick := mededelingOnClick;

    //resulteren dat alles is gelukt
    result := true;
  end;


  {
    * AfterConstruction
  }
  procedure TMededeling.AfterConstruction;
  begin

    //inialiseren
    Self.tekst := TStringList.Create();
  end;

  {
    * BeforeDestruction
  }
  procedure TMededeling.BeforeDestruction;
  begin

    //controleren of tekst bestaad zodoende vrijgeven
    if Assigned(self.tekst) then
      Self.tekst.Free();
  end;

end.
